package com.internetCafes.spms.common.module.mongodb;


import java.util.List;

import com.internetCafes.spms.core.utils.PageUtils;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;


/**
 * mongodb　基础操作类
 *
 */
public abstract class MongodbBaseDao<T> {

    /**
     * spring mongodb　集成操作类　
     */
    protected MongoTemplate mongoTemplate;

    /**
     * 通过条件查询,查询分页结果
     *
     * @param pageNo
     * @param pageSize
     * @param query
     * @return
     */
    public PageUtils page(int pageNo, int pageSize, Query query) {
        long totalCount = mongoTemplate.count(query, this.getEntityClass());
        PageUtils page = new PageUtils(totalCount, pageSize, pageNo);
        query.skip(page.getFirstResult());// skip相当于从那条记录开始
        query.limit(pageSize);// 从skip开始,取多少条记录
        List<T> datas = this.find(query);
        page.setList(datas);
        return page;
    }


    /**
     * 通过条件查询实体(集合)
     *
     * @param query
     */
    public List<T> find(Query query) {
        return mongoTemplate.find(query, this.getEntityClass());
    }

    /**
     * 通过一定的条件查询一个实体
     *
     * @param query
     * @return
     */
    public T findOne(Query query) {
        return mongoTemplate.findOne(query, this.getEntityClass());
    }

    /**
     * 查询出所有数据
     *
     * @return
     */
    public List<T> findAll() {
        return this.mongoTemplate.findAll(getEntityClass());
    }

    /**
     * 查询并且修改记录
     *
     * @param query
     * @param update
     * @return
     */
    public T findAndModify(Query query, Update update) {

        return this.mongoTemplate.findAndModify(query, update, this.getEntityClass());
    }

    /**
     * 按条件查询,并且删除记录
     *
     * @param query
     * @return
     */
    public T findAndRemove(Query query) {
        return this.mongoTemplate.findAndRemove(query, this.getEntityClass());
    }

    /**
     * 通过条件查询更新数据
     *
     * @param query
     * @param update
     * @return
     */
    public void updateFirst(Query query, Update update) {
        mongoTemplate.updateFirst(query, update, this.getEntityClass());
    }

    /**
     * 保存一个对象到mongodb
     *
     * @param bean
     * @return
     */
    public T save(T bean) {
        mongoTemplate.save(bean);
        return bean;
    }

    /**
     * 通过ID获取记录
     *
     * @param id
     * @return
     */
    public T findById(Long id) {
        return mongoTemplate.findById(id, this.getEntityClass());
    }

    /**
     * 通过ID获取记录,并且指定了集合名(表的意思)
     *
     * @param id
     * @param collectionName
     *            集合名
     * @return
     */
    public T findById(Long id, String collectionName) {
        return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
    }

    /**
     * 获取需要操作的实体类class
     *
     * @return
     */
    protected abstract Class<T> getEntityClass();

    /**
     * 注入mongodbTemplate
     *
     * @param mongoTemplate
     */
    protected abstract void setMongoTemplate(MongoTemplate mongoTemplate);

}

